﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include <stdint.h>
#include "ElementId.h"

namespace gcmp
{ 
    /// \brief 文档保存错误码
    enum class DocumentSaveError : int32_t
    {
        Unknown = -1,               ///< 未知错误。
        Ok = 0,                     ///< 保存成功。
        FilePathNotExist = 1,       ///< 路径不存在。
        CanNotSaveMaterials = 2,    ///< 材质不能保存。
        InvalidFilePath = 4,        ///< 路径不合法。
        RemoveOldFileFail = 8,      ///< 删除老文件失败。
        NoSpace = 16,               ///< 磁盘空间不足。
        NoPrivilege = 32,           ///< 没有权限。
    };

    /// \brief 文档保存结果
    struct DocumentSaveResult
    {
        DocumentSaveError Code;     ///< 文件保存错误码
        std::wstring Message;       ///< 错误信息

        /// \brief 默认构造函数
        DocumentSaveResult() : Code(DocumentSaveError::Ok), Message(L"") {}

        /// \brief 构造函数
        DocumentSaveResult(const DocumentSaveError& code, const std::wstring& message)  : Code(code), Message(message) {}
    };

    /// \brief 文档保存选项
    struct DocumentSaveOptions
    {
        bool BackupSkeletonDataOfElement = false;   /// < 默认值为false。为true则备份Element的骨架数据，骨架数据包含BasicInformation、 ElementParameters、ElementModelShape和Status。
                                                    /// < 打开文档时，如果文档中有不认识的Element，并且之前保存时选择备份了骨架数据，则读取骨架数据读取、生成对应的IncompleteElement。
                                                    /// < 备份骨架数据对保存的性能有影响，根据需要选用。

        bool SaveIncompleteElement       = false;   /// < 默认值为false。为true则保存文档中的IncompleteElement对象到持久化介质上。
                                                    /// < IncompleteElement对象通常在打开数据源、但没有代码解析数据时，由骨架数据生成。
                                                    /// < 保存下来的目的是希望下次打开时，依旧能读入IncompleteElement对象。
        /// \brief 增量保存列表
        std::vector<ElementId> SaveElements;

        /// \brief 构造函数
        DocumentSaveOptions(
            bool backupSkeletonDataOfElement,
            bool saveIncompleteElement = false
        ) 
            : BackupSkeletonDataOfElement(backupSkeletonDataOfElement)
            , SaveIncompleteElement(saveIncompleteElement)
        {}
    };
}// namespace gcmp
